/**
 * 
 */
package com.atjava.nebula.core.util.entity;

import com.atjava.nebula.core.constant.Constant;
import com.atjava.nebula.core.dao.ibatis.Condition;
import com.atjava.nebula.core.exception.baseExp.BusinessException;
import com.atjava.nebula.core.exception.baseExp.SystemException;
import com.atjava.nebula.core.util.bean.MyBeanUtils;
import com.atjava.nebula.core.util.func.StringUtil;

/**本类提供对实体类的一些相关辅助方法
 * @author kyo
 *
 */
public class EntitySupport {
	
	/**把主键串转换为一个保存有该主键值的表对象
	 * @param pkIds 主键字符串 如：id1=1[,]id2=33
	 * @return 返回保存主键值的表对象
	 * @throws BusinessException 
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 */
	public static <T> T getPkToEntity(Class<T> entityClass,String pkIds) throws SystemException {
		T entityById=null;
	
		try {
			entityById = entityClass.newInstance();
		} catch (Exception e) {
			throw new SystemException(e,"建立实体类实例失败");
		} 
		if(pkIds==null || pkIds.equals("")) {
			throw new SystemException("主键字符串[ pkids ]内容为空");				
		}
		for (String id : pkIds.split(Constant.PK_SEPARATOR_REGEX)) {
			String mtdName;
			String mtdVal;
		
			//mtdName=id.split("=")[0].substring(0, 1).toUpperCase() + id.split("=")[0].substring(1);
			//mtdName=id.split("=")[0].toLowerCase();
			String []idArray=id.split("=");
			if(idArray.length<2)
				throw new SystemException("主键字符串(pkIds)值为空");
			mtdName=id.split("=")[0];
			mtdVal=(id.split("=")[1]);
			MyBeanUtils.setPropertyEx(entityById,mtdName,mtdVal);
			//ReflectUtil.setFieldValue(entityById,mtdName,mtdVal);
			//map.put(id.split("=")[0], id.split("=")[1]);
		}			


		return entityById;
	}	
	
	public static void setPkToEntity(Class<?> entityClass,Object entity,String pkIds) throws SystemException {
	
		if(pkIds==null || pkIds.equals("")) {
			throw new SystemException("主键字符串[ pkids ]内容为空");				
		}
		for (String id : pkIds.split(Constant.PK_SEPARATOR_REGEX)) {
			String mtdName;
			String mtdVal;
		
			//mtdName=id.split("=")[0].substring(0, 1).toUpperCase() + id.split("=")[0].substring(1);
			//mtdName=id.split("=")[0].toLowerCase();
			String []idArray=id.split("=");
			if(idArray.length<2)
				throw new SystemException("主键字符串(pkIds)值为空");
			mtdName=id.split("=")[0];
			mtdVal=(id.split("=")[1]);
			MyBeanUtils.setPropertyEx(entity,mtdName,mtdVal);
			//ReflectUtil.setFieldValue(entityById,mtdName,mtdVal);
			//map.put(id.split("=")[0], id.split("=")[1]);
		}			

	}	
	


	/**把主键字符串转换为一个Map
	 * @param pkIds pkIds 主键字符串 如：id1=1[,]id2=33
	 * @return 返回Map对象
	
	public static Map<String,String> getPkToMap(String pkIds) {

		Map<String,String> map=new HashMap<String, String>();
		try {
			for (String id : pkIds.split(Constant.PK_SEPARATOR_REGEX)) {
				map.put(id.split("=")[0], id.split("=")[1]);
			}			
		} catch (Exception e) {
			e.printStackTrace();
		}

		return map; 
	}	*/

	/**把主键串转换为查询子树的条件对象
	 * @param pkIds 主键字符串 如：id1=1[,]id2=33
	 * @param treeIdList 保存树配置的TreeId对象List
	 * @return
	
	public static Condition getPkToTreeIdCond(String pkIds, List<TreeId> treeIdList) {

		Condition cond = new Condition();

		String fName;
		String fVal;
		// pkIds为空时，即寻找该树的根结点，父级编号为空的即认为是根结点
		if (pkIds == null || pkIds.equals("")) {
			// throw new QLightException("主键字符串(pkIds)内容为空");

			for (TreeId treeId : treeIdList) {
				fName = treeId.getTreeNodePid().toLowerCase();
				// cond.addIsNULL(fName);
				// cond.addCriterion("ltrim("+fName+")", "=", "");
				if(treeId.getTreeRootIdVal()==null || treeId.getTreeRootIdVal().equals(""))
					cond.addCriterion("(ltrim(" + fName + ")='' or " + fName
							+ " is NULL)");
				else
					cond.addCriterion(treeId.getTreeNodeId(), "=", treeId.getTreeRootIdVal());

			}
		} else {
			for (String id : pkIds.split(Constant.PK_SEPARATOR_REGEX)) {

				// mtdName=id.split("=")[0].substring(0, 1).toUpperCase() +
				// id.split("=")[0].substring(1);
				fName = id.split("=")[0].toLowerCase();
				// 找出主键字段相对应的保存树的父节点的字段名
				for (TreeId treeId : treeIdList) {
					if (treeId.getTreeNodeId().equalsIgnoreCase(fName)) {
						fName = treeId.getTreeNodePid().toLowerCase();
						break;
					}
				}
				fVal = (id.split("=")[1]);
				cond.addCriterion(fName, "=", fVal);
			}
		}

		return cond;
	} */
	
	/**把主键字符串转换为一个包含等于该主键值的Condition对象
	 * @param pkIds pkIds 主键字符串 如：id1=1[,]id2=33
	 * @return 返回Condition对象
	 */
	public static  Condition getPkToCond(String pkIds) {

		Condition cond=new Condition();
		try {
			if(pkIds==null || pkIds.equals("")) {
				throw new BusinessException("主键字符串(pkIds)内容为空");
			}
			for (String id : pkIds.split(Constant.PK_SEPARATOR_REGEX)) {
				String mtdName;
				String mtdVal;

				mtdName=id.split("=")[0];
				mtdVal=(id.split("=")[1]);
				mtdName = StringUtil.toUnderlineName(mtdName).toUpperCase();
				cond.addCriterion(mtdName, "=", mtdVal);
			}			
		} catch (Exception e) {
			e.printStackTrace();
		}

		return cond;
	}
	
	/**把主键字符串转换为一个包含有不等于该主键值的Condition对象
	 * @param pkIds pkIds 主键字符串 如：id1=1[,]id2=33
	 * @return 返回Condition对象
	 */
	public static  Condition getNotPkToCond(String pkIds) {

		Condition cond=new Condition();
		try {
			if(pkIds==null || pkIds.equals("")) {
				throw new BusinessException("主键字符串(pkIds)内容为空");
			}
			for (String id : pkIds.split(Constant.PK_SEPARATOR_REGEX)) {
				String mtdName;
				String mtdVal;

				mtdName=id.split("=")[0];
				mtdVal=(id.split("=")[1]);
				mtdName = StringUtil.toUnderlineName(mtdName).toUpperCase();
				cond.addCriterion(mtdName, "<>", mtdVal);
			}			
		} catch (Exception e) {
			e.printStackTrace();
		}

		return cond;
	}		


	/** 根据传入的实体Bean和主键字段列表，返回拼接的主键字符串,如 "id=1[,]cd=one",多个主键用[,]分隔
	 * @param <T>
	 * @param entity 表的实体Bean实例
	 * @param pkFields  主键字段名数组
	 * @return 返回当前Bean的主键串(支持联合主键)
	 */
	public static <T> String getPk2String(T entity,String [] pkFields) {


		StringBuilder pkval = new StringBuilder();
		for (int i = 0; i < pkFields.length; i++) {
			String pk = pkFields[i];
			String v = null;
			try {
				v = MyBeanUtils.getPropertyEx(entity, pk);
			} catch (Exception e) {
				e.printStackTrace();
			}
//			if (v == null || v.trim().equals("")) // 只把不为空的主键存入到串里
//				continue;
//			pkval.append(pk).append("=").append(StringUtil.rightTrim(v));
//			Changed By Lo 2009-2-28
//			修改原因：当主键为字符型，而且主键值为空格时主键不能被正确处理			
			if (v == null || v.equals("")) // 只把不为空的主键存入到串里
				continue;
			pkval.append(pk).append("=").append((v));			
			if (i + 1 != pkFields.length)
				pkval.append(Constant.PK_SEPARATOR);
		}
		return pkval.toString();
	}	
}
